#include "serveur_theatre.hpp"

#include "lecteur_scenario.hpp"

#include <iostream>

#include <QFile>

#define NOM_CLASSE "ServeurTheatre"

#include "deboguer.hpp"

ServeurTheatre::ServeurTheatre(QObject * parent):
  Serveur(parent)
{
  ENTER("ServeurTheatre(QObject * parent)");
  ADD_ARG("parent", parent);
  QObject::connect(this, SIGNAL(connexion(unsigned int)),
		   this, SLOT(reagir_connexion(unsigned int)));
  QObject::connect(this, SIGNAL(deconnexion(unsigned int)),
		   this, SLOT(oublier_socket(unsigned int)));
  QObject::connect(this, SIGNAL(message(unsigned int, Protocole::Message)),
		   this, SLOT(lire(unsigned int, Protocole::Message)));
  ouvrir_global();
}

void ServeurTheatre::reagir_connexion(unsigned int c)
{
  ENTER("reagir_connexion(unsigned int c)");
  ADD_ARG("c", c);
  LecteurScenario * scenar = new LecteurScenario(this);
  scenarii.append(QPair<unsigned int, QSharedPointer<LecteurScenario> >
		  (c, QSharedPointer<LecteurScenario>(scenar)));
  QObject::connect(scenar, SIGNAL(doit_emettre(Protocole::Message)),
		   this, SLOT(transmettre_scenar(Protocole::Message)));
  QObject::connect(scenar, 
		   SIGNAL(erreur(Protocole::Message,
				 Protocole::Message)),
		   this,
		   SLOT(erreur_scenar(Protocole::Message, 
				      Protocole::Message)));
  QObject::connect(scenar, SIGNAL(hors_scenario(Protocole::Message)),
		   this, SLOT(hors_scenar(Protocole::Message)));
  std::cout<<"Connexion de "<<c<<std::endl;
  QFile fichier(QString::fromUtf8(fname.c_str()));
  if(fichier.open(QIODevice::ReadOnly | QIODevice::Text))
    {
      QStringList liste;
      scenar->lire_scenario(fichier.readAll(), liste);
      for(QStringList::const_iterator i = liste.begin() ;
	  i != liste.end() ; i++)
	{
	  std::cout<<"Attention : "<<i->toUtf8().data()<<" est ignoré."
		   <<std::endl;
	}
    }
  else
    {
      std::cout<<"Pas de fichier "<<fname<<", le scénario est vide."
	       <<std::endl;
    }
}

void ServeurTheatre::oublier_socket(unsigned int client)
{
  ENTER("oublier_socket(unsigned int client)");
  ADD_ARG("client", client);
  for(int i = 0 ; i < scenarii.size() ; i++)
    {
      if(scenarii[i].first == client)
	{
	  std::cout<<"Déconnexion de "<<client<<std::endl;
	  scenarii.removeAt(i);
	  i--;
	}
    }
}

void ServeurTheatre::lire(unsigned int client, Protocole::Message m)
{
  ENTER("lire(unsigned int client, Protocole::Message m)");
  ADD_ARG("client", client);
  ADD_ARG("m", m);
  for(QList
	<QPair
	<unsigned int, QSharedPointer<LecteurScenario> 
	 > 
	>::const_iterator i = scenarii.constBegin() ;
      i != scenarii.constEnd() ; i++)
    {
      if(i->first == client)
	{
	  std::cout<<"Le client "<<client<<" dit "<<m<<"..."<<std::endl;
	  i->second->recevoir_message(m);
	  std::cout<<"Le message de "<<client<<" est traité."<<std::endl;
	}
    }
}
void ServeurTheatre::transmettre_scenar(Protocole::Message m)
{
  ENTER("transmettre_scenar(Protocole::Message m)");
  ADD_ARG("m", m);
  QObject * scenar = sender();  
  for(QList
	<QPair
	<unsigned int, QSharedPointer<LecteurScenario> 
	 > 
	>::const_iterator i = scenarii.constBegin() ;
      i != scenarii.constEnd() ; i++)
    {
      if(i->second == scenar)
	{
	  std::cout<<"Le serveur dit "<<m<<" à "<<i->first<<"..."
		   <<std::endl;
	  emit envoyer(i->first, m);
	  std::cout<<"Le message à "<<i->first<<" est traité."<<std::endl;
	}
    }
}
void ServeurTheatre::erreur_scenar(Protocole::Message recu, 
				   Protocole::Message attendu)
{
  ENTER("erreur_scenar(Protocole::Message recu, Protocole::Message attendu)");
  ADD_ARG("recu", recu);
  ADD_ARG("attendu", attendu);
  QObject * scenar = sender();  
  for(QList
	<QPair
	<unsigned int, QSharedPointer<LecteurScenario> 
	 > 
    >::const_iterator i = scenarii.constBegin() ;
      i != scenarii.constEnd() ; i++)
    {
      if(i->second == scenar)
	{
	  std::cout<<"Le client "<<i->first
		   <<" a dit "<<recu<<" au lieu de "<<attendu<<" !"
		   <<std::endl;
	}
    }
}
void ServeurTheatre::hors_scenar(Protocole::Message m)
{
  ENTER("hors_scenar(Protocole::Message m)");
  ADD_ARG("m", m);
  QObject * scenar = sender();  
  for(QList
	<QPair
	<unsigned int, QSharedPointer<LecteurScenario> 
	 > 
    >::const_iterator i = scenarii.constBegin() ;
      i != scenarii.constEnd() ; i++)
    {
      if(i->second == scenar)
	{
	  std::cout<<"Le client "<<i->first
		   <<" a dit "<<m<<" après la fin du scénario !"
		   <<std::endl;
	}
    }
}

void ServeurTheatre::utiliser_scenario(const std::string & fname)
{
  ENTER("utiliser_scenario(const std::string & fname)");
  ADD_ARG("fname", fname);
  this->fname = fname;
}
